﻿/******************************************************************************
 * Copyright (c) 2011, S. Kyle Korndoerfer
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 *  * Redistributions of source code must retain the above copyright notice, 
 *      this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the 
 *      documentation and/or other materials provided with the distribution.
 *  * Neither the name of KyKo Software nor the names of its contributors may 
 *      be used to endorse or promote products derived from this software 
 *      without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE. 
 *****************************************************************************/

using System;
using System.Globalization;
using System.Net;
using System.Text;
using System.Web;

namespace WebSequenceDiagrams
{
    /// <summary>
    ///     Wrapper for accessing the Web Sequence Diagram service.
    /// </summary>
    public class Service : IService
    {
        #region Fields

        /// <summary>Base Url to the Web Sequence Diagram website.</summary>
        public static readonly Uri BaseUrl = new Uri(  "http://www.websequencediagrams.com" );

        /// <summary>Url to POST the request to.</summary>
        private static readonly Uri PostUrl = new Uri( BaseUrl + @"/index.php" );

        /// <summary>Query String format.</summary>
        /// <remarks>
        ///     Possible parameters:
        /// 
        ///         PNG Parameters:
        ///             style={default|napkin|...}
        ///             scale={100|90|...|10}
        ///         PDF Parameters:
        ///             paginate={0|...?...} (unknown)
        ///             paper={letter|...?...}
        ///             landscape={0|1}
        ///             format={png|pdf}
        /// </remarks>
        private const string QueryFormatString = "?style={0}&scale={1}&message={2}";

        #endregion

        #region Events

        /// <summary>
        ///     Event that is raised once the response from the service has
        ///     been received.
        /// </summary>
        public event EventHandler<DownloadCompleteEventArgs> DownloadComplete;

        #endregion

        /// <summary>
        ///     Gets the data from the service using the supplied parameters.
        /// </summary>
        /// <param name="style">The style used to render the diagram.</param>
        /// <param name="scale">The scale to generate the diagram in.</param>
        /// <param name="message">The sequence text to generate the diagram
        ///     from.</param>
        /// <param name="proxy">The proxy settings to use (if needed).</param>
        public void GetSequenceDiagram(
                string style,
                string scale,
                string message,
                IWebProxy proxy )
        {
            // build the query string
            var query = string.Format(
                    CultureInfo.InvariantCulture,
                    QueryFormatString,
                    string.IsNullOrEmpty( style ) ? Styles.Napkin : style,
                    string.IsNullOrEmpty( scale ) ? "100" : scale,
                    HttpUtility.UrlEncode( message, Encoding.UTF8 ) );

            // full url to access.
            var url = new Uri( PostUrl + query );

            // create the WebClient to connect to the service
            var client = new WebClient
                             {
                                 Proxy = proxy
                             };

            // assign the method that will handle the response
            client.DownloadDataCompleted += DownloadDataCompleted;

            // invoke the service
            client.DownloadDataAsync( url );
        }// GetSequenceDiagram()

        #region Helper methods

        /// <summary>
        ///     Triggers the Download Completed event after the response from
        ///     the Web Sequence Diagram service is received.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DownloadDataCompleted( object sender, DownloadDataCompletedEventArgs e )
        {
            if ( e.Result != null && e.Error == null )
            {
                EventHandler<DownloadCompleteEventArgs> handler = DownloadComplete;

                if (handler != null )
                {
                    var args = new DownloadCompleteEventArgs( e.Result, e.Error );

                    handler( this, args );
                }// if
            }// if
        }// DownloadDataCompleted( sender, e )

        #endregion

    }// Service

}// WebSequenceDiagrams
